home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Languguage OS 2
/
Languguage OS II Version 10-94 (Knowledge Media)(1994).ISO
/
language
/
parallax
/
more_exa.tar
/
more
/
nbody.p
< prev
next >
Wrap
Text File
|
1991-11-26
|
4KB
|
156 lines
SYSTEM N_BODY_PROBLEM;
CONST n = 3;
G = 2.4024E-4; (* km**3 / (Mt * h**2) *)
hours = 24;
zunit = 100;
iter = hours * zunit;
zstep = 1.0 / FLOAT(zunit); (* h *)
zq_2 = zstep * zstep / 2.0; (* h**2 *)
TYPE data = ARRAY [1..n] OF REAL;
CONST minit = data(1.994E21, 5.97E15, 7.35E13);
(* mass : Mt *)
xinit = data(0.0, 1.495E8, 1.491E8);
(* X-coordinates : km *)
yinit = data(0.0, 0.0, 0.0);
(* Y-coordinates : km *)
zinit = data(0.0, 0.0, 0.0);
(* Z-coordinates : km *)
vxinit = data(0.0, 0.0, 0.0);
(* X-speed : km/h *)
vyinit = data(0.0, 1.072E5, 1.038E5);
(* Y-speed : km/h *)
vzinit = data(0.0, 0.0, 2.97E2);
(* Z-speed : km/h *)
SCALAR dvar : data;
time : INTEGER; (* Time in Hours * zunit *)
CONFIGURATION BODY[1..n];
VECTOR mass : REAL; (* mass : Mt *)
x, y, z : REAL; (* coordinates : km *)
vx, vy, vz : REAL; (* speed : km/h *)
ax, ay, az : REAL; (* accelerations : km/h**2 *)
CONFIGURATION interaction[1..n],[1..n];
CONNECTION BODY1: interaction [i,j] <-> BODY[i].ww1;
BODY2: interaction [i,j] <-> BODY[j].ww2;
VECTOR m1, m2 : REAL; (* mass : Mt *)
gm : REAL; (* G * m2 : km**3 / h**2 *)
SCALAR i : INTEGER;
PROCEDURE init;
BEGIN
time := 0;
PARALLEL BODY
dvar := minit;
LOAD(mass, dvar);
dvar := xinit;
LOAD(x , dvar);
dvar := yinit;
LOAD(y , dvar);
dvar := zinit;
LOAD(z , dvar);
dvar := vxinit;
LOAD(vx , dvar);
dvar := vyinit;
LOAD(vy , dvar);
dvar := vzinit;
LOAD(vz , dvar);
SEND BODY.ww1 (mass) TO interaction.BODY1 (m1);
SEND BODY.ww2 (mass) TO interaction.BODY2 (m2);
ENDPARALLEL;
PARALLEL interaction
gm := G * m2;
ENDPARALLEL
END init;
PROCEDURE step;
VECTOR x1, y1, z1 : REAL; (* coordinates BODY1 : km *)
x2, y2, z2 : REAL; (* coordinates BODY2 : km *)
dx, dy, dz : REAL; (* distance-components : km *)
dq : REAL; (* square of distance : km**2 *)
k : REAL; (* common constants : 1/h**2 *)
BEGIN
INC (time);
PARALLEL interaction[*],[DIM1 <> DIM2]
RECEIVE interaction.BODY1 (x1) FROM BODY.ww1 (x);
RECEIVE interaction.BODY2 (x2) FROM BODY.ww2 (x);
RECEIVE interaction.BODY1 (y1) FROM BODY.ww1 (y);
RECEIVE interaction.BODY2 (y2) FROM BODY.ww2 (y);
RECEIVE interaction.BODY1 (z1) FROM BODY.ww1 (z);
RECEIVE interaction.BODY2 (z2) FROM BODY.ww2 (z);
dx := x2 - x1;
dy := y2 - y1;
dz := z2 - z1;
dq := dx*dx + dy*dy + dz*dz;
k := gm / (dq * Sqrt(dq));
SEND interaction.BODY1 (k * dx) TO BODY.ww1 (ax) REDUCE.SUM;
SEND interaction.BODY1 (k * dy) TO BODY.ww1 (ay) REDUCE.SUM;
SEND interaction.BODY1 (k * dz) TO BODY.ww1 (az) REDUCE.SUM;
ENDPARALLEL;
PARALLEL BODY
x := x + vx * zstep + ax * zq_2;
y := y + vy * zstep + ay * zq_2;
z := z + vz * zstep + az * zq_2;
vx := vx + ax * zstep;
vy := vy + ay * zstep;
vz := vz + az * zstep;
ENDPARALLEL
END step;
PROCEDURE output;
TYPE name = ARRAY [1..8] OF CHAR;
SCALAR dfeld : data;
i : INTEGER;
PROCEDURE outline(SCALAR s : name);
BEGIN
WriteString(s);
FOR i := 1 TO n DO
WriteString(" ");
WriteReal(dfeld[i],15);
END; (* FOR *)
WriteLn;
END outline;
BEGIN
WriteInt(time DIV zunit,5);
WriteString(" ");
FOR i := 1 TO n DO
WriteString(" BODY"); WriteInt(i,3); WriteString(" ");
END; (* FOR *)
WriteLn;
PARALLEL BODY
STORE(mass , dfeld); outline("m : ");
STORE(x , dfeld); outline("x : ");
STORE(y , dfeld); outline("y : ");
STORE(z , dfeld); outline("z : ");
STORE(vx , dfeld); outline("vx : ");
STORE(vy , dfeld); outline("vy : ");
STORE(vz , dfeld); outline("vz : ");
ENDPARALLEL
END output;
BEGIN
init;
output;
LOOP
FOR i := 1 TO iter DO
step;
END; (* FOR *)
output;
END; (* LOOP *)
END N_BODY_PROBLEM.